Kosaraju Algorithm

過程

建立反圖 GT,在 GT 上 DFS 並記錄每個點離開的時間

依照離開時間大到小的順序在原圖 G 上 DFS 即可正確找出 SCC

原本的圖

 

證明

感性理解

若 A 可以走到 B,代表 B 裡面的所有點都要走完才會返回到 A

From 資訊之芽

From IONC

假設 G 在 DFS 時,節點 y 比節點 x 先進入堆疊,那麼 GT 上 DFS 時會先由節點 x 開始

【Case 1】若在 GT 上 DFS 時,可以由 x 到達 y,則代表 G 上存在 path(y,x)

G 上不存在 path(y,x),則一開始在 G 上的 postorder traversal 中結點 y 必須比節點 x 晚進入堆疊,違反假設,因此在這樣的狀況下 G 上必存在 path(y,x),也就是說 xy 存在同一個強連通分量中。

【Case 2】若在 GT 上 DFS 時,無法由 x 到達 y,則代表在 G 上不存在 path(y,x)xy 都不會存在於同一個強連通分量中,也不會影響到演算法的正確性。

歸納所有 Case 1 的狀況,就能求出所有的強連通分輛,Case 2 則構成了完成縮點後的邊。最後這個證明還缺了一部分 : 這個演算法找出的強連通分量是最大的,此部分留給讀者思考。